package rpcx_device_manager_centre

// IpcType 摄像头类型
// 1=NVR , 2=IPC , 3=枪机 , 4=球机 , 5=全景相机 ,
// 6=移动监拍 , 7=无人机 , 8=机器人 , 9=手机APP ,
// 10=智能报警设备 ,11 = 可移动设备(不经过接入中心)
type IpcType int64

const (
	IPCType_Other      IpcType = 0 //未知
	IPCType_NVR        IpcType = 1
	IPCType_IPC        IpcType = 2  //IPC
	IPCType_Spear      IpcType = 3  //枪机
	IPCType_Ball       IpcType = 4  //球机
	IPCType_Panorama   IpcType = 5  //全景相机
	IPCType_Monitoring IpcType = 6  //监拍
	IPCType_UAV        IpcType = 7  //无人机
	IPCType_Bot        IpcType = 8  //机器人
	IPCType_Phone      IpcType = 9  //手机APP
	IPCType_Panalarm   IpcType = 10 //智能报警设备
	IPCType_Mobile     IpcType = 11 //可移动设备(不通过接入中心控制的设备)
)

// LinkMode 通道信息的 链接型号 :
// 1- TCP方式，2- UDP方式，
// 3- RTP方式，
// 4- RTP/RTSP，
// 5- RTSP/HTTP,
// 6- RTMP/HTTP
type LinkMode int64

const (
	LinkMode_Other     LinkMode = 0 //未知
	LinkMode_TCP       LinkMode = 1
	LinkMode_UDP       LinkMode = 2
	LinkMode_RTP       LinkMode = 3
	LinkMode_RTP_RTSP  LinkMode = 4
	LinkMode_RTSP_HTTP LinkMode = 5
	LinkMode_RTMP_HTTP LinkMode = 6
)

// MediaConfig 媒体中心配置
type MediaConfig struct {
	MediaID                   string //媒体中心ID
	PushPushStreamIP          string // 推流IP
	PushPushStreamPort        int64  // 推流端口
	NatMscPushStreamStartIP   string // 外网推流IP
	NatMscPushStreamStartPort int64  // 外网推流端口
}

// Response 通用响应
type Response struct {
	EventID string //任务ID
	TransID string //事务id
	ErrCode int64
	ErrMsg  string
}

type RequestDeviceInfo struct {
	ParentDeviceID  string //父级设备ID(必须:是)
	ParentChannelID int64  //父级设备通道号(必须:是)
	DeviceID        string //摄像头ID (必须:是)
	//ConnectSolutionID string //接入方案ID (必须:是)
	//DccID             string //接入中心ID = 设备管理中心_编号 + 接入中心_编号 (必须:是)
}

// VideoFlowControl 视频流控制
type VideoFlowControl struct {
	TID      string //事务ID
	AppID    string //请求ID
	StreamID string //视频流ID (必须:是)
	SSRC     string //ssrc

	RequestDeviceInfo
	MediaConfig //媒体中心信息 (必须:是)

	StartTime     int64  //历史视频 开始时间
	EndTime       int64  //历史视频 结束时间
	ScaleType     string //历史视频 播放倍速类型
	OffsetTime    int64  //历史视频 跳转偏移量
	DownloadSpeed int64

	IsNat             bool   //是否是外网
	LinkMode          int64  //tcp=1,udp=2
	ConnectSolutionID string //接入方案ID (必须:是)
	DccID             string //接入中心ID = 设备管理中心_编号 + 接入中心_编号 (必须:是)
}

// VideoFlowResponse 视频流返回
type VideoFlowResponse struct {
	DeviceID        string //设备ID
	DeviceCity      string //设备所属城市
	ParentDeviceID  string //父级设备ID
	ParentChannelID int64  //父级设备通道号
	IpcType         int64
	RtmpUrl         string
	StreamID        string // 流ID
	MediaID         string // 媒体中心ID
	SSRCStr         string // SSRC
	App             string // 请求ID
	IsNat           bool
	PullStreamUrl   string // 拉流地址（三方接入）
	DccID           string // 接入中心ID
	Code            int64  // 响应代码
	Msg             string // 响应信息
	PlayID          string `json:"playID"` //历史视频标记
	IsRecorder      bool   //是否开启视频录像
}

// CommonParam 摄像头设备控制 通用参数
type CommonParam struct {
	DeviceID          string //设备ID
	ChannelID         int64  //通道ID
	ConnectSolutionID string //接入方案ID
}

type PTZControlParam struct {
	TID string
	CommonParam
	PTZCmd     string //云台控制命令
	PTZSpeed   int64  //PTZ 速度，值越大，代表速度越快 1-255
	IsStop     bool   //是否停止
	IsPriority bool   //是否是高优先级
}

// PTZControlParam 设备控制请求参数
//type PTZControlParam struct {
//	CommonParam
//	PTZCmd   string //云台控制命令
//	PTZSpeed int64  //PTZ 速度，值越大，代表速度越快 1-255
//	IsStop   bool   //是否停止
//}

// PresetControlParam 设备预置点操作参数
type PresetControlParam struct {
	TID string
	CommonParam
	PresetCmd uint8 //预置点命令 1=设置预置点, 2=清除预置点, 3=转到预置点
	PresetNum int64 //预置点序号
}

// GuardControlParam 设备布防参数
type GuardControlParam struct {
	TID string
	CommonParam
	IsCancel bool //是否取消布防
}

// CruiseControlParam 云台巡航控制参数
type CruiseControlParam struct {
	CommonParam
	CruiseCmdType uint8 //巡航控制命令类型
	CruiseRoute   int64 //巡航路径序号
	CruisePoint   int64 //巡航点序号
	CruiseData    int64 //参数值
}

// CascadeRelation 级联关系
type CascadeRelation struct {
	ID                int64  `gorm:"type:bigint(20);primaryKey;AutoIncrement;comment:自增ID" `
	DeviceSipId       string `gorm:"type:varchar(255);comment:设备ID" `
	ParentDeviceSipId string `gorm:"type:varchar(255);comment:父级设备ID" `
	Region            string `gorm:"type:varchar(255);comment:域"`
}

// Page 分页
type Page struct {
	PagePre  int64
	PageNext int64
	ParamID  string
}

// ReqDcc 接入中心请求
type ReqDcc struct {
	Method
	Page      Page
	DccCenter ConnectCenterInfo
}

// RespDcc 接入中心响应
type RespDcc struct {
	Response *Response
	DccList  []*ConnectCenterInfo
	DccOne   ConnectCenterInfo
}

// ReqConnectSolution  接入方案请求
type ReqConnectSolution struct {
	Method
	Page     Page
	Solution AccessSolution
}

// RespConnectSolution 接入方案响应
type RespConnectSolution struct {
	Response     Response
	SolutionList []*AccessSolution
	SolutionOne  AccessSolution
}

// ReqDevice 设备请求
type ReqDevice struct {
	Method
	Page      Page
	DeviceReq DeviceInfo
}

// RespDevice 设备响应
type RespDevice struct {
	Count      int64 //设备总数量
	DeviceList []DeviceInfo
}

// DeviceCount 设备统计
type DeviceCount struct {
	CurrentNumber int64 //设备当前总数
	AddNumber     int64 //添加数量
}

// ReqBatchAddDevice 设备批量添加请求
type ReqBatchAddDevice struct {
	NvrDeviceID string //Nvr ID
	StartNumber int64  //开始位置 (开始数2 不包含2 下个是  3,4,5,...)
	AddNumber   int64  //添加数量 (递增生成设备忽略已经存在的设备)
}

// RespBatchAddDevice 设备批量添加响应
type RespBatchAddDevice struct {
	Response   Response
	DeviceOne  DeviceInfo
	DeviceList []DeviceInfo
	DeviceCount
}

// ReqPTZControl 摄像头云台请求
type ReqPTZControl struct {
	PTZControl       PTZControlParam
	PTZPresetControl PresetControlParam
	GuardControl     GuardControlParam
	Page             Page
}

// RespPTZControl 摄像头云台响应
type RespPTZControl struct {
	Response      Response
	PTZPresetList []*CameraPresetPoints
}

// ReqSubScribe 订阅请求
type ReqSubScribe struct {
	Method
	Subscribe Subscribe
	Page      Page
}

// RespSubScribe 订阅响应
type RespSubScribe struct {
	Subscribe     Subscribe
	SubscribeList []*Subscribe
	Response      Response
}

// ReqCascadeRelation 级联关系请求
type ReqCascadeRelation struct {
	Method
	CascadeRelation CascadeRelation
	Page            Page
}

// RespCascadeRelation 级联关系响应
type RespCascadeRelation struct {
	CascadeRelation     CascadeRelation
	ListCascadeRelation []*CascadeRelation
	Response            Response
}

// ReqAddDevice 添加设备
type ReqAddDevice struct {
	Method
	ProvinceIdentify ProvinceIdentify
	DeviceIdentify   DeviceIdentify
	DeviceReq        DeviceInfo
}

// RespAddDevice 添加设备响应
type RespAddDevice struct {
	ParentDeviceInfo DeviceInfo
	ListDeviceInfo   []*DeviceInfo
	Response         Response
}

// ReqSecureGateway 网闸请求
type ReqSecureGateway struct {
	Method
	Page     Page
	GateArea GateArea
	Gateway  Gateway
}

// RespSecureGateway 网闸响应
type RespSecureGateway struct {
	Response    Response
	GateArea    GateArea
	GatewayList []Gateway
}

// ReqDeviceStatus 状态统计请求
type ReqDeviceStatus struct {
	Page                      Page
	DeviceStatusStatisticsReq DeviceStatusStatistics
}

// RespDeviceStatus 设备状态列表
type RespDeviceStatus struct {
	CountNum                   int64
	DeviceStatusStatisticsList []DeviceStatusStatistics
}
